package com.bbz.core.concurrency.work1;

/**
 * 死锁Demo 避免死锁的方式
 * 
 * 既然可能产生死锁，那么接下来，讲一下如何避免死锁。
 * 
 * 1、让程序每次至多只能获得一个锁。当然，在多线程环境下，这种情况通常并不现实
 * 
 * 2、设计时考虑清楚锁的顺序，尽量减少嵌在的加锁交互数量
 * 
 * 3、既然死锁的产生是两个线程无限等待对方持有的锁，那么只要等待时间有个上限不就好了。当然synchronized不具备这个功能，但是我们可以使用Lock类中的tryLock方法去尝试获取锁，这个方法可以指定一个超时时限，在等待超过该时限之后变回返回一个失败信息
 * 
 * @author binbin.a.zhang
 *
 */
public class LockDemo {
	private static String left = "1";
	private static String right = "2";

	public static void main(String args[]) {
		Thread thread = new Thread(new leftLock());
		Thread thread1 = new Thread(new rightLock());
		thread.start();
		thread1.start();
	}

	static class leftLock implements Runnable {
		@Override
		public void run() {
			synchronized (left) {
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (right) {
					System.out.println("leftRight end!");
				}
			}

		}

	}

	static class rightLock implements Runnable {
		@Override
		public void run() {
			synchronized (right) {
				try {
					Thread.sleep(3000);
					right.notifyAll();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (left) {
					System.out.println("leftRight end!");
				}
			}
		}

	}

}
